//package cn.coderliu.service.impl;
//
//import cn.coderliu.common.ReturnData;
//import cn.coderliu.common.constant.ProcessConstants;
//import cn.coderliu.common.core.FlowServiceFactory;
//import cn.coderliu.common.core.FormConf;
//import cn.coderliu.common.core.domain.ProcessQuery;
//import cn.coderliu.common.utils.ProcessFormUtils;
//import cn.coderliu.common.utils.ProcessUtils;
//import cn.coderliu.common.utils.TaskUtils;
//import cn.coderliu.mapper.WfDeployFormMapper;
//import cn.coderliu.model.WfDeployForm;
//import cn.coderliu.model.page.ProcessQueryPage;
//import cn.coderliu.model.vo.WfDefinitionVo;
//import cn.coderliu.model.vo.WfDeployFormVo;
//import cn.coderliu.model.vo.WfTaskVo;
//import cn.coderliu.service.IWfProcessService;
//import cn.coderliu.service.IWfTaskService;
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.convert.Convert;
//import cn.hutool.core.date.BetweenFormatter;
//import cn.hutool.core.date.DateUtil;
//import cn.hutool.core.io.IORuntimeException;
//import cn.hutool.core.io.IoUtil;
//import cn.hutool.core.util.ObjectUtil;
//import cn.hutool.core.util.StrUtil;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import lombok.RequiredArgsConstructor;
//import org.flowable.bpmn.constants.BpmnXMLConstants;
//import org.flowable.bpmn.model.Process;
//import org.flowable.bpmn.model.*;
//import org.flowable.engine.history.HistoricActivityInstance;
//import org.flowable.engine.history.HistoricActivityInstanceQuery;
//import org.flowable.engine.history.HistoricProcessInstance;
//import org.flowable.engine.history.HistoricProcessInstanceQuery;
//import org.flowable.engine.repository.Deployment;
//import org.flowable.engine.repository.ProcessDefinition;
//import org.flowable.engine.repository.ProcessDefinitionQuery;
//import org.flowable.engine.runtime.ProcessInstance;
//import org.flowable.engine.task.Comment;
//import org.flowable.identitylink.api.history.HistoricIdentityLink;
//import org.flowable.task.api.Task;
//import org.flowable.task.api.TaskQuery;
//import org.flowable.task.api.history.HistoricTaskInstance;
//import org.flowable.task.api.history.HistoricTaskInstanceQuery;
//import org.flowable.variable.api.history.HistoricVariableInstance;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.io.InputStream;
//import java.util.*;
//import java.util.stream.Collectors;
//
///**
// * @author KonBAI
// * @createTime 2022/3/24 18:57
// */
//@RequiredArgsConstructor
//@Service
//public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProcessService {
//
//    private final IWfTaskService wfTaskService;
//    //    private final ISysUserService userService;
////    private final ISysRoleService roleService;
////    private final ISysDeptService deptService;
//    private final WfDeployFormMapper deployFormMapper;
//
//    /**
//     * 流程定义列表
//     *
//     * @param pageQuery 分页参数
//     * @return 流程定义分页列表数据
//     */
//    @Override
//    public ReturnData<Page<WfDefinitionVo>> selectPageStartProcessList(ProcessQueryPage processQueryPage) {
//        Page<WfDefinitionVo> page = new Page<>(processQuery.getCurrent(), processQuery.getSize());
//        // 流程定义列表数据查询
//        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery()
//                .latestVersion()
//                .active()
//                .orderByProcessDefinitionKey()
//                .asc();
//        // 构建搜索条件
//        ProcessUtils.buildProcessSearch(processDefinitionQuery, Convert.convert(ProcessQuery.class, processQueryPage));
//        long pageTotal = processDefinitionQuery.count();
//        if (pageTotal <= 0) {
//            return ReturnData.succeed();
//        }
//        int offset = pageQuery.getPageSize() * (pageQuery.getPageNum() - 1);
//        List<ProcessDefinition> definitionList = processDefinitionQuery.listPage(offset, pageQuery.getPageSize());
//
//        List<WfDefinitionVo> definitionVoList = new ArrayList<>();
//        for (ProcessDefinition processDefinition : definitionList) {
//            String deploymentId = processDefinition.getDeploymentId();
//            Deployment deployment = repositoryService.createDeploymentQuery().deploymentId(deploymentId).singleResult();
//            WfDefinitionVo vo = new WfDefinitionVo();
//            vo.setDefinitionId(processDefinition.getId());
//            vo.setProcessKey(processDefinition.getKey());
//            vo.setProcessName(processDefinition.getName());
//            vo.setVersion(processDefinition.getVersion());
//            vo.setDeploymentId(processDefinition.getDeploymentId());
//            vo.setSuspended(processDefinition.isSuspended());
//            // 流程定义时间
//            vo.setCategory(deployment.getCategory());
//            vo.setDeploymentTime(deployment.getDeploymentTime());
//            definitionVoList.add(vo);
//        }
//        page.setRecords(definitionVoList);
//        page.setTotal(pageTotal);
//        return ReturnData.succeed(page);
//    }
//
//    @Override
//    public List<WfDefinitionVo> selectStartProcessList(ProcessQuery processQuery) {
//        // 流程定义列表数据查询
//        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery()
//                .latestVersion()
//                .active()
//                .orderByProcessDefinitionKey()
//                .asc();
//        // 构建搜索条件
//        ProcessUtils.buildProcessSearch(processDefinitionQuery, processQuery);
//
//        List<ProcessDefinition> definitionList = processDefinitionQuery.list();
//
//        List<WfDefinitionVo> definitionVoList = new ArrayList<>();
//        for (ProcessDefinition processDefinition : definitionList) {
//            String deploymentId = processDefinition.getDeploymentId();
//            Deployment deployment = repositoryService.createDeploymentQuery().deploymentId(deploymentId).singleResult();
//            WfDefinitionVo vo = new WfDefinitionVo();
//            vo.setDefinitionId(processDefinition.getId());
//            vo.setProcessKey(processDefinition.getKey());
//            vo.setProcessName(processDefinition.getName());
//            vo.setVersion(processDefinition.getVersion());
//            vo.setDeploymentId(processDefinition.getDeploymentId());
//            vo.setSuspended(processDefinition.isSuspended());
//            // 流程定义时间
//            vo.setCategory(deployment.getCategory());
//            vo.setDeploymentTime(deployment.getDeploymentTime());
//            definitionVoList.add(vo);
//        }
//        return definitionVoList;
//    }
//
//    @Override
//    public ReturnData<Page<WfTaskVo>> selectPageOwnProcessList(ProcessQueryPage processQueryPage) {
//        Page<WfTaskVo> page = new Page<>(processQueryPage.getCurrent(), processQueryPage.getSize());
//        HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery()
//                .startedBy(TaskUtils.getUserId())
//                .orderByProcessInstanceStartTime()
//                .desc();
//        // 构建搜索条件
//        ProcessUtils.buildProcessSearch(historicProcessInstanceQuery, Convert.convert(ProcessQuery.class, processQueryPage));
//        int offset = pageQuery.getPageSize() * (pageQuery.getPageNum() - 1);
//        List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery
//                .listPage(offset, pageQuery.getPageSize());
//        page.setTotal(historicProcessInstanceQuery.count());
//        List<WfTaskVo> taskVoList = new ArrayList<>();
//        for (HistoricProcessInstance hisIns : historicProcessInstances) {
//            WfTaskVo taskVo = new WfTaskVo();
//            // 获取流程状态
//            HistoricVariableInstance processStatusVariable = historyService.createHistoricVariableInstanceQuery()
//                    .processInstanceId(hisIns.getId())
//                    .variableName(ProcessConstants.PROCESS_STATUS_KEY)
//                    .singleResult();
//            String processStatus = null;
//            if (ObjectUtil.isNotNull(processStatusVariable)) {
//                processStatus = Convert.toStr(processStatusVariable.getValue());
//            }
//            // 兼容旧流程
//            if (processStatus == null) {
//                processStatus = ObjectUtil.isNull(hisIns.getEndTime()) ? ProcessStatus.RUNNING.getStatus() : ProcessStatus.COMPLETED.getStatus();
//            }
//            taskVo.setProcessStatus(processStatus);
//            taskVo.setCreateTime(hisIns.getStartTime());
//            taskVo.setFinishTime(hisIns.getEndTime());
//            taskVo.setProcInsId(hisIns.getId());
//
//            // 计算耗时
//            if (Objects.nonNull(hisIns.getEndTime())) {
//                taskVo.setDuration(DateUtils.getDatePoor(hisIns.getEndTime(), hisIns.getStartTime()));
//            } else {
//                taskVo.setDuration(DateUtils.getDatePoor(DateUtils.getNowDate(), hisIns.getStartTime()));
//            }
//            // 流程部署实例信息
//            Deployment deployment = repositoryService.createDeploymentQuery()
//                    .deploymentId(hisIns.getDeploymentId()).singleResult();
//            taskVo.setDeployId(hisIns.getDeploymentId());
//            taskVo.setProcDefId(hisIns.getProcessDefinitionId());
//            taskVo.setProcDefName(hisIns.getProcessDefinitionName());
//            taskVo.setProcDefVersion(hisIns.getProcessDefinitionVersion());
//            taskVo.setCategory(deployment.getCategory());
//            // 当前所处流程
//            List<Task> taskList = taskService.createTaskQuery().processInstanceId(hisIns.getId()).includeIdentityLinks().list();
//            if (CollUtil.isNotEmpty(taskList)) {
//                taskVo.setTaskName(taskList.stream().map(Task::getName).filter(StringUtils::isNotEmpty).collect(Collectors.joining(",")));
//            }
//            taskVoList.add(taskVo);
//        }
//        page.setRecords(taskVoList);
//        return ReturnData.succeed(page);
//    }
//
//    @Override
//    public List<WfTaskVo> selectOwnProcessList(ProcessQuery processQuery) {
//        HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery()
//                .startedBy(TaskUtils.getUserId())
//                .orderByProcessInstanceStartTime()
//                .desc();
//        // 构建搜索条件
//        ProcessUtils.buildProcessSearch(historicProcessInstanceQuery, processQuery);
//        List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.list();
//        List<WfTaskVo> taskVoList = new ArrayList<>();
//        for (HistoricProcessInstance hisIns : historicProcessInstances) {
//            WfTaskVo taskVo = new WfTaskVo();
//            taskVo.setCreateTime(hisIns.getStartTime());
//            taskVo.setFinishTime(hisIns.getEndTime());
//            taskVo.setProcInsId(hisIns.getId());
//
//            // 计算耗时
//            if (Objects.nonNull(hisIns.getEndTime())) {
//                taskVo.setDuration(DateUtils.getDatePoor(hisIns.getEndTime(), hisIns.getStartTime()));
//            } else {
//                taskVo.setDuration(DateUtils.getDatePoor(DateUtils.getNowDate(), hisIns.getStartTime()));
//            }
//            // 流程部署实例信息
//            Deployment deployment = repositoryService.createDeploymentQuery()
//                    .deploymentId(hisIns.getDeploymentId()).singleResult();
//            taskVo.setDeployId(hisIns.getDeploymentId());
//            taskVo.setProcDefId(hisIns.getProcessDefinitionId());
//            taskVo.setProcDefName(hisIns.getProcessDefinitionName());
//            taskVo.setProcDefVersion(hisIns.getProcessDefinitionVersion());
//            taskVo.setCategory(deployment.getCategory());
//            // 当前所处流程
//            List<Task> taskList = taskService.createTaskQuery().processInstanceId(hisIns.getId()).includeIdentityLinks().list();
//            if (CollUtil.isNotEmpty(taskList)) {
//                taskVo.setTaskName(taskList.stream().map(Task::getName).filter(StringUtils::isNotEmpty).collect(Collectors.joining(",")));
//            }
//            taskVoList.add(taskVo);
//        }
//        return taskVoList;
//    }
//
//    @Override
//    public ReturnData<Page<WfTaskVo>> selectPageTodoProcessList(ProcessQueryPage processQuery) {
//        Page<WfTaskVo> page = new Page<>();
//        TaskQuery taskQuery = taskService.createTaskQuery()
//                .active()
//                .includeProcessVariables()
//                .taskCandidateOrAssigned(TaskUtils.getUserId())
//                .taskCandidateGroupIn(TaskUtils.getCandidateGroup())
//                .orderByTaskCreateTime().desc();
//        // 构建搜索条件
//        ProcessUtils.buildProcessSearch(taskQuery, Convert.convert());
//        page.setTotal(taskQuery.count());
//        int offset = pageQuery.getPageSize() * (pageQuery.getPageNum() - 1);
//        List<Task> taskList = taskQuery.listPage(offset, pageQuery.getPageSize());
//        List<WfTaskVo> flowList = new ArrayList<>();
//        for (Task task : taskList) {
//            WfTaskVo flowTask = new WfTaskVo();
//            // 当前流程信息
//            flowTask.setTaskId(task.getId());
//            flowTask.setTaskDefKey(task.getTaskDefinitionKey());
//            flowTask.setCreateTime(task.getCreateTime());
//            flowTask.setProcDefId(task.getProcessDefinitionId());
//            flowTask.setTaskName(task.getName());
//            // 流程定义信息
//            ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
//                    .processDefinitionId(task.getProcessDefinitionId())
//                    .singleResult();
//            flowTask.setDeployId(pd.getDeploymentId());
//            flowTask.setProcDefName(pd.getName());
//            flowTask.setProcDefVersion(pd.getVersion());
//            flowTask.setProcInsId(task.getProcessInstanceId());
//
//            // 流程发起人信息
//            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
//                    .processInstanceId(task.getProcessInstanceId())
//                    .singleResult();
//            SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId()));
//            flowTask.setStartUserId(startUser.getNickName());
//            flowTask.setStartUserName(startUser.getNickName());
//            flowTask.setStartDeptName(startUser.getDept().getDeptName());
//
//            // 流程变量
//            flowTask.setProcVars(this.getProcessVariables(task.getId()));
//
//            flowList.add(flowTask);
//        }
//        page.setRecords(flowList);
//        return ReturnData.succeed(page);
//    }
//
//    @Override
//    public List<WfTaskVo> selectTodoProcessList(ProcessQuery processQuery) {
//        TaskQuery taskQuery = taskService.createTaskQuery()
//                .active()
//                .includeProcessVariables()
//                .taskCandidateOrAssigned(TaskUtils.getUserId())
//                .taskCandidateGroupIn(TaskUtils.getCandidateGroup())
//                .orderByTaskCreateTime().desc();
//        // 构建搜索条件
//        ProcessUtils.buildProcessSearch(taskQuery, processQuery);
//        List<Task> taskList = taskQuery.list();
//        List<WfTaskVo> taskVoList = new ArrayList<>();
//        for (Task task : taskList) {
//            WfTaskVo taskVo = new WfTaskVo();
//            // 当前流程信息
//            taskVo.setTaskId(task.getId());
//            taskVo.setTaskDefKey(task.getTaskDefinitionKey());
//            taskVo.setCreateTime(task.getCreateTime());
//            taskVo.setProcDefId(task.getProcessDefinitionId());
//            taskVo.setTaskName(task.getName());
//            // 流程定义信息
//            ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
//                    .processDefinitionId(task.getProcessDefinitionId())
//                    .singleResult();
//            taskVo.setDeployId(pd.getDeploymentId());
//            taskVo.setProcDefName(pd.getName());
//            taskVo.setProcDefVersion(pd.getVersion());
//            taskVo.setProcInsId(task.getProcessInstanceId());
//
//            // 流程发起人信息
//            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
//                    .processInstanceId(task.getProcessInstanceId())
//                    .singleResult();
//            SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId()));
//            taskVo.setStartUserId(startUser.getNickName());
//            taskVo.setStartUserName(startUser.getNickName());
//            taskVo.setStartDeptName(startUser.getDept().getDeptName());
//            // 流程变量
//            taskVo.setProcVars(this.getProcessVariables(task.getId()));
//
//            taskVoList.add(taskVo);
//        }
//        return taskVoList;
//    }
//
//    @Override
//    public TableDataInfo<WfTaskVo> selectPageClaimProcessList(ProcessQuery processQuery, PageQuery pageQuery) {
//        Page<WfTaskVo> page = new Page<>();
//        TaskQuery taskQuery = taskService.createTaskQuery()
//                .active()
//                .includeProcessVariables()
//                .taskCandidateUser(TaskUtils.getUserId())
//                .taskCandidateGroupIn(TaskUtils.getCandidateGroup())
//                .orderByTaskCreateTime().desc();
//        // 构建搜索条件
//        ProcessUtils.buildProcessSearch(taskQuery, processQuery);
//        page.setTotal(taskQuery.count());
//        int offset = pageQuery.getPageSize() * (pageQuery.getPageNum() - 1);
//        List<Task> taskList = taskQuery.listPage(offset, pageQuery.getPageSize());
//        List<WfTaskVo> flowList = new ArrayList<>();
//        for (Task task : taskList) {
//            WfTaskVo flowTask = new WfTaskVo();
//            // 当前流程信息
//            flowTask.setTaskId(task.getId());
//            flowTask.setTaskDefKey(task.getTaskDefinitionKey());
//            flowTask.setCreateTime(task.getCreateTime());
//            flowTask.setProcDefId(task.getProcessDefinitionId());
//            flowTask.setTaskName(task.getName());
//            // 流程定义信息
//            ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
//                    .processDefinitionId(task.getProcessDefinitionId())
//                    .singleResult();
//            flowTask.setDeployId(pd.getDeploymentId());
//            flowTask.setProcDefName(pd.getName());
//            flowTask.setProcDefVersion(pd.getVersion());
//            flowTask.setProcInsId(task.getProcessInstanceId());
//
//            // 流程发起人信息
//            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
//                    .processInstanceId(task.getProcessInstanceId())
//                    .singleResult();
//            SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId()));
//            flowTask.setStartUserId(startUser.getNickName());
//            flowTask.setStartUserName(startUser.getNickName());
//            flowTask.setStartDeptName(startUser.getDept().getDeptName());
//
//            flowList.add(flowTask);
//        }
//        page.setRecords(flowList);
//        return ReturnData.succeed(page);
//    }
//
//    @Override
//    public List<WfTaskVo> selectClaimProcessList(ProcessQuery processQuery) {
//        TaskQuery taskQuery = taskService.createTaskQuery()
//                .active()
//                .includeProcessVariables()
//                .taskCandidateUser(TaskUtils.getUserId())
//                .taskCandidateGroupIn(TaskUtils.getCandidateGroup())
//                .orderByTaskCreateTime().desc();
//        // 构建搜索条件
//        ProcessUtils.buildProcessSearch(taskQuery, processQuery);
//        List<Task> taskList = taskQuery.list();
//        List<WfTaskVo> flowList = new ArrayList<>();
//        for (Task task : taskList) {
//            WfTaskVo flowTask = new WfTaskVo();
//            // 当前流程信息
//            flowTask.setTaskId(task.getId());
//            flowTask.setTaskDefKey(task.getTaskDefinitionKey());
//            flowTask.setCreateTime(task.getCreateTime());
//            flowTask.setProcDefId(task.getProcessDefinitionId());
//            flowTask.setTaskName(task.getName());
//            // 流程定义信息
//            ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
//                    .processDefinitionId(task.getProcessDefinitionId())
//                    .singleResult();
//            flowTask.setDeployId(pd.getDeploymentId());
//            flowTask.setProcDefName(pd.getName());
//            flowTask.setProcDefVersion(pd.getVersion());
//            flowTask.setProcInsId(task.getProcessInstanceId());
//
//            // 流程发起人信息
//            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
//                    .processInstanceId(task.getProcessInstanceId())
//                    .singleResult();
//            SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId()));
//            flowTask.setStartUserId(startUser.getNickName());
//            flowTask.setStartUserName(startUser.getNickName());
//            flowTask.setStartDeptName(startUser.getDept().getDeptName());
//
//            flowList.add(flowTask);
//        }
//        return flowList;
//    }
//
//    @Override
//    public TableDataInfo<WfTaskVo> selectPageFinishedProcessList(ProcessQuery processQuery, PageQuery pageQuery) {
//        Page<WfTaskVo> page = new Page<>();
//        HistoricTaskInstanceQuery taskInstanceQuery = historyService.createHistoricTaskInstanceQuery()
//                .includeProcessVariables()
//                .finished()
//                .taskAssignee(TaskUtils.getUserId())
//                .orderByHistoricTaskInstanceEndTime()
//                .desc();
//        // 构建搜索条件
//        ProcessUtils.buildProcessSearch(taskInstanceQuery, processQuery);
//        int offset = pageQuery.getPageSize() * (pageQuery.getPageNum() - 1);
//        List<HistoricTaskInstance> historicTaskInstanceList = taskInstanceQuery.listPage(offset, pageQuery.getPageSize());
//        List<WfTaskVo> hisTaskList = new ArrayList<>();
//        for (HistoricTaskInstance histTask : historicTaskInstanceList) {
//            WfTaskVo flowTask = new WfTaskVo();
//            // 当前流程信息
//            flowTask.setTaskId(histTask.getId());
//            // 审批人员信息
//            flowTask.setCreateTime(histTask.getCreateTime());
//            flowTask.setFinishTime(histTask.getEndTime());
//            flowTask.setDuration(DateUtil.formatBetween(histTask.getDurationInMillis(), BetweenFormatter.Level.SECOND));
//            flowTask.setProcDefId(histTask.getProcessDefinitionId());
//            flowTask.setTaskDefKey(histTask.getTaskDefinitionKey());
//            flowTask.setTaskName(histTask.getName());
//
//            // 流程定义信息
//            ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
//                    .processDefinitionId(histTask.getProcessDefinitionId())
//                    .singleResult();
//            flowTask.setDeployId(pd.getDeploymentId());
//            flowTask.setProcDefName(pd.getName());
//            flowTask.setProcDefVersion(pd.getVersion());
//            flowTask.setProcInsId(histTask.getProcessInstanceId());
//            flowTask.setHisProcInsId(histTask.getProcessInstanceId());
//
//            // 流程发起人信息
//            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
//                    .processInstanceId(histTask.getProcessInstanceId())
//                    .singleResult();
//            SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId()));
//            flowTask.setStartUserId(startUser.getNickName());
//            flowTask.setStartUserName(startUser.getNickName());
//            flowTask.setStartDeptName(startUser.getDept().getDeptName());
//
//            // 流程变量
//            flowTask.setProcVars(this.getProcessVariables(histTask.getId()));
//
//            hisTaskList.add(flowTask);
//        }
//        page.setTotal(taskInstanceQuery.count());
//        page.setRecords(hisTaskList);
////        Map<String, Object> result = new HashMap<>();
////        result.put("result",page);
////        result.put("finished",true);
//        return ReturnData.succeed(page);
//    }
//
//    @Override
//    public List<WfTaskVo> selectFinishedProcessList(ProcessQuery processQuery) {
//        HistoricTaskInstanceQuery taskInstanceQuery = historyService.createHistoricTaskInstanceQuery()
//                .includeProcessVariables()
//                .finished()
//                .taskAssignee(TaskUtils.getUserId())
//                .orderByHistoricTaskInstanceEndTime()
//                .desc();
//        // 构建搜索条件
//        ProcessUtils.buildProcessSearch(taskInstanceQuery, processQuery);
//        List<HistoricTaskInstance> historicTaskInstanceList = taskInstanceQuery.list();
//        List<WfTaskVo> hisTaskList = new ArrayList<>();
//        for (HistoricTaskInstance histTask : historicTaskInstanceList) {
//            WfTaskVo flowTask = new WfTaskVo();
//            // 当前流程信息
//            flowTask.setTaskId(histTask.getId());
//            // 审批人员信息
//            flowTask.setCreateTime(histTask.getCreateTime());
//            flowTask.setFinishTime(histTask.getEndTime());
//            flowTask.setDuration(DateUtil.formatBetween(histTask.getDurationInMillis(), BetweenFormatter.Level.SECOND));
//            flowTask.setProcDefId(histTask.getProcessDefinitionId());
//            flowTask.setTaskDefKey(histTask.getTaskDefinitionKey());
//            flowTask.setTaskName(histTask.getName());
//
//            // 流程定义信息
//            ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
//                    .processDefinitionId(histTask.getProcessDefinitionId())
//                    .singleResult();
//            flowTask.setDeployId(pd.getDeploymentId());
//            flowTask.setProcDefName(pd.getName());
//            flowTask.setProcDefVersion(pd.getVersion());
//            flowTask.setProcInsId(histTask.getProcessInstanceId());
//            flowTask.setHisProcInsId(histTask.getProcessInstanceId());
//
//            // 流程发起人信息
//            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
//                    .processInstanceId(histTask.getProcessInstanceId())
//                    .singleResult();
//            SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId()));
//            flowTask.setStartUserId(startUser.getNickName());
//            flowTask.setStartUserName(startUser.getNickName());
//            flowTask.setStartDeptName(startUser.getDept().getDeptName());
//
//            // 流程变量
//            flowTask.setProcVars(this.getProcessVariables(histTask.getId()));
//
//            hisTaskList.add(flowTask);
//        }
//        return hisTaskList;
//    }
//
//    @Override
//    public FormConf selectFormContent(String definitionId, String deployId, String procInsId) {
//        BpmnModel bpmnModel = repositoryService.getBpmnModel(definitionId);
//        if (ObjectUtil.isNull(bpmnModel)) {
//            throw new RuntimeException("获取流程设计失败！");
//        }
//        StartEvent startEvent = ModelUtils.getStartEvent(bpmnModel);
//        WfDeployForm deployForm = deployFormMapper.selectOne(new LambdaQueryWrapper<WfDeployForm>()
//                .eq(WfDeployForm::getDeployId, deployId)
//                .eq(WfDeployForm::getFormKey, startEvent.getFormKey())
//                .eq(WfDeployForm::getNodeKey, startEvent.getId()));
//        FormConf formConf = JsonUtils.parseObject(deployForm.getContent(), FormConf.class);
//        if (ObjectUtil.isNull(formConf)) {
//            throw new RuntimeException("获取流程表单失败！");
//        }
//        if (ObjectUtil.isNotEmpty(procInsId)) {
//            // 获取流程实例
//            HistoricProcessInstance historicProcIns = historyService.createHistoricProcessInstanceQuery()
//                    .processInstanceId(procInsId)
//                    .includeProcessVariables()
//                    .singleResult();
//            // 填充表单信息
//            ProcessFormUtils.fillFormData(formConf, historicProcIns.getProcessVariables());
//        }
//        return formConf;
//    }
//
//    /**
//     * 根据流程定义ID启动流程实例
//     *
//     * @param procDefId 流程定义Id
//     * @param variables 流程变量
//     * @return
//     */
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public void startProcessByDefId(String procDefId, Map<String, Object> variables) {
//        try {
//            ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
//                    .processDefinitionId(procDefId).singleResult();
//            startProcess(processDefinition, variables);
//        } catch (Exception e) {
//            e.printStackTrace();
//            throw new ServiceException("流程启动错误");
//        }
//    }
//
//    /**
//     * 通过DefinitionKey启动流程
//     *
//     * @param procDefKey 流程定义Key
//     * @param variables  扩展参数
//     */
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public void startProcessByDefKey(String procDefKey, Map<String, Object> variables) {
//        try {
//            ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
//                    .processDefinitionKey(procDefKey).latestVersion().singleResult();
//            startProcess(processDefinition, variables);
//        } catch (Exception e) {
//            e.printStackTrace();
//            throw new RuntimeException("流程启动错误");
//        }
//    }
//
//    /**
//     * 读取xml文件
//     *
//     * @param processDefId 流程定义ID
//     */
//    @Override
//    public String queryBpmnXmlById(String processDefId) {
//        InputStream inputStream = repositoryService.getProcessModel(processDefId);
//        try {
//            return IoUtil.readUtf8(inputStream);
//        } catch (IORuntimeException exception) {
//            throw new RuntimeException("加载xml文件异常");
//        }
//    }
//
//    /**
//     * 流程详情信息
//     *
//     * @param procInsId 流程实例ID
//     * @param taskId    任务ID
//     * @return
//     */
//    @Override
//    public WfDetailVo queryProcessDetail(String procInsId, String taskId) {
//        WfDetailVo detailVo = new WfDetailVo();
//        // 获取流程实例
//        HistoricProcessInstance historicProcIns = historyService.createHistoricProcessInstanceQuery()
//                .processInstanceId(procInsId)
//                .includeProcessVariables()
//                .singleResult();
//        if (StringUtils.isNotBlank(taskId)) {
//            HistoricTaskInstance taskIns = historyService.createHistoricTaskInstanceQuery()
//                    .taskId(taskId)
//                    .includeIdentityLinks()
//                    .includeProcessVariables()
//                    .includeTaskLocalVariables()
//                    .singleResult();
//            if (taskIns == null) {
//                throw new ServiceException("没有可办理的任务！");
//            }
//            detailVo.setTaskFormData(currTaskFormData(historicProcIns.getDeploymentId(), taskIns));
//        }
//        // 获取Bpmn模型信息
//        InputStream inputStream = repositoryService.getProcessModel(historicProcIns.getProcessDefinitionId());
//        String bpmnXmlStr = StrUtil.utf8Str(IoUtil.readBytes(inputStream, false));
//        BpmnModel bpmnModel = ModelUtils.getBpmnModel(bpmnXmlStr);
//        detailVo.setBpmnXml(bpmnXmlStr);
//        detailVo.setHistoryProcNodeList(historyProcNodeList(historicProcIns));
//        detailVo.setProcessFormList(processFormList(bpmnModel, historicProcIns));
//        detailVo.setFlowViewer(getFlowViewer(bpmnModel, procInsId));
//        return detailVo;
//    }
//
//    /**
//     * 启动流程实例
//     */
//    private void startProcess(ProcessDefinition procDef, Map<String, Object> variables) {
//        if (ObjectUtil.isNotNull(procDef) && procDef.isSuspended()) {
//            throw new ServiceException("流程已被挂起，请先激活流程");
//        }
//        // 设置流程发起人Id到流程中
//        String userIdStr = TaskUtils.getUserId();
//        identityService.setAuthenticatedUserId(userIdStr);
//        variables.put(BpmnXMLConstants.ATTRIBUTE_EVENT_START_INITIATOR, userIdStr);
//        // 设置流程状态为进行中
//        variables.put(ProcessConstants.PROCESS_STATUS_KEY, ProcessStatus.RUNNING.getStatus());
//        // 发起流程实例
//        ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDef.getId(), variables);
//        // 第一个用户任务为发起人，则自动完成任务
//        wfTaskService.startFirstTask(processInstance, variables);
//    }
//
//
//    /**
//     * 获取流程变量
//     *
//     * @param taskId 任务ID
//     * @return 流程变量
//     */
//    private Map<String, Object> getProcessVariables(String taskId) {
//        HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery()
//                .includeProcessVariables()
//                .finished()
//                .taskId(taskId)
//                .singleResult();
//        if (Objects.nonNull(historicTaskInstance)) {
//            return historicTaskInstance.getProcessVariables();
//        }
//        return taskService.getVariables(taskId);
//    }
//
//    /**
//     * 获取当前任务流程表单信息
//     */
//    private FormConf currTaskFormData(String deployId, HistoricTaskInstance taskIns) {
//        WfDeployFormVo deployFormVo = Convert.convert(WfDeployFormVo.class,
//                deployFormMapper.selectOne(new LambdaQueryWrapper<WfDeployForm>()
//                        .eq(WfDeployForm::getDeployId, deployId)
//                        .eq(WfDeployForm::getFormKey, taskIns.getFormKey())
//                        .eq(WfDeployForm::getNodeKey, taskIns.getTaskDefinitionKey())));
//        if (ObjectUtil.isNotEmpty(deployFormVo)) {
//            FormConf currTaskFormData = JsonUtils.parseObject(deployFormVo.getContent(), FormConf.class);
//            if (null != currTaskFormData) {
//                currTaskFormData.setFormBtns(false);
//                ProcessFormUtils.fillFormData(currTaskFormData, taskIns.getTaskLocalVariables());
//                return currTaskFormData;
//            }
//        }
//        return null;
//    }
//
//
//    /**
//     * 获取历史流程表单信息
//     */
//    private List<FormConf> processFormList(BpmnModel bpmnModel, HistoricProcessInstance historicProcIns) {
//        List<FormConf> procFormList = new ArrayList<>();
//
//        List<HistoricActivityInstance> activityInstanceList = historyService.createHistoricActivityInstanceQuery()
//                .processInstanceId(historicProcIns.getId()).finished()
//                .activityTypes(CollUtil.newHashSet(BpmnXMLConstants.ELEMENT_EVENT_START, BpmnXMLConstants.ELEMENT_TASK_USER))
//                .orderByHistoricActivityInstanceStartTime().asc()
//                .list();
//        List<String> processFormKeys = new ArrayList<>();
//        for (HistoricActivityInstance activityInstance : activityInstanceList) {
//            // 获取当前节点流程元素信息
//            FlowElement flowElement = ModelUtils.getFlowElementById(bpmnModel, activityInstance.getActivityId());
//            // 获取当前节点表单Key
//            String formKey = ModelUtils.getFormKey(flowElement);
//            if (formKey == null) {
//                continue;
//            }
//            boolean localScope = Convert.toBool(ModelUtils.getElementAttributeValue(flowElement, ProcessConstants.PROCESS_FORM_LOCAL_SCOPE), false);
//            Map<String, Object> variables;
//            if (localScope) {
//                // 查询任务节点参数，并转换成Map
//                variables = historyService.createHistoricVariableInstanceQuery()
//                        .processInstanceId(historicProcIns.getId())
//                        .taskId(activityInstance.getTaskId())
//                        .list()
//                        .stream()
//                        .collect(Collectors.toMap(HistoricVariableInstance::getVariableName, HistoricVariableInstance::getValue));
//            } else {
//                if (processFormKeys.contains(formKey)) {
//                    continue;
//                }
//                variables = historicProcIns.getProcessVariables();
//                processFormKeys.add(formKey);
//            }
//            // 非节点表单此处查询结果可能有多条，只获取第一条信息
//            List<WfDeployFormVo> formInfoList = deployFormMapper.selectVoList(new LambdaQueryWrapper<WfDeployForm>()
//                    .eq(WfDeployForm::getDeployId, historicProcIns.getDeploymentId())
//                    .eq(WfDeployForm::getFormKey, formKey)
//                    .eq(localScope, WfDeployForm::getNodeKey, flowElement.getId()));
//            WfDeployFormVo formInfo = formInfoList.iterator().next();
//            if (ObjectUtil.isNotNull(formInfo)) {
//                // 旧数据 formInfo.getFormName() 为 null
//                String formName = Optional.ofNullable(formInfo.getFormName()).orElse(StringUtils.EMPTY);
//                String title = localScope ? formName.concat("(" + flowElement.getName() + ")") : formName;
//                FormConf formConf = JsonUtils.parseObject(formInfo.getContent(), FormConf.class);
//                if (null != formConf) {
//                    formConf.setTitle(title);
//                    formConf.setDisabled(true);
//                    formConf.setFormBtns(false);
//                    ProcessFormUtils.fillFormData(formConf, variables);
//                    procFormList.add(formConf);
//                }
//            }
//        }
//        return procFormList;
//    }
//
//    @Deprecated
//    private void buildStartFormData(HistoricProcessInstance historicProcIns, Process process, String deployId, List<FormConf> procFormList) {
//        procFormList = procFormList == null ? new ArrayList<>() : procFormList;
//        HistoricActivityInstance startInstance = historyService.createHistoricActivityInstanceQuery()
//                .processInstanceId(historicProcIns.getId())
//                .activityId(historicProcIns.getStartActivityId())
//                .singleResult();
//        StartEvent startEvent = (StartEvent) process.getFlowElement(startInstance.getActivityId());
//        WfDeployFormVo startFormInfo = deployFormMapper.selectVoOne(new LambdaQueryWrapper<WfDeployForm>()
//                .eq(WfDeployForm::getDeployId, deployId)
//                .eq(WfDeployForm::getFormKey, startEvent.getFormKey())
//                .eq(WfDeployForm::getNodeKey, startEvent.getId()));
//        if (ObjectUtil.isNotNull(startFormInfo)) {
//            FormConf formConf = JsonUtils.parseObject(startFormInfo.getContent(), FormConf.class);
//            if (null != formConf) {
//                formConf.setTitle(startEvent.getName());
//                formConf.setDisabled(true);
//                formConf.setFormBtns(false);
//                ProcessFormUtils.fillFormData(formConf, historicProcIns.getProcessVariables());
//                procFormList.add(formConf);
//            }
//        }
//    }
//
//    @Deprecated
//    private void buildUserTaskFormData(String procInsId, String deployId, Process process, List<FormConf> procFormList) {
//        procFormList = procFormList == null ? new ArrayList<>() : procFormList;
//        List<HistoricActivityInstance> activityInstanceList = historyService.createHistoricActivityInstanceQuery()
//                .processInstanceId(procInsId).finished()
//                .activityType(BpmnXMLConstants.ELEMENT_TASK_USER)
//                .orderByHistoricActivityInstanceStartTime().asc()
//                .list();
//        for (HistoricActivityInstance instanceItem : activityInstanceList) {
//            UserTask userTask = (UserTask) process.getFlowElement(instanceItem.getActivityId(), true);
//            String formKey = userTask.getFormKey();
//            if (formKey == null) {
//                continue;
//            }
//            // 查询任务节点参数，并转换成Map
//            Map<String, Object> variables = historyService.createHistoricVariableInstanceQuery()
//                    .processInstanceId(procInsId)
//                    .taskId(instanceItem.getTaskId())
//                    .list()
//                    .stream()
//                    .collect(Collectors.toMap(HistoricVariableInstance::getVariableName, HistoricVariableInstance::getValue));
//            WfDeployFormVo deployFormVo = deployFormMapper.selectVoOne(new LambdaQueryWrapper<WfDeployForm>()
//                    .eq(WfDeployForm::getDeployId, deployId)
//                    .eq(WfDeployForm::getFormKey, formKey)
//                    .eq(WfDeployForm::getNodeKey, userTask.getId()));
//            if (ObjectUtil.isNotNull(deployFormVo)) {
//                FormConf formConf = JsonUtils.parseObject(deployFormVo.getContent(), FormConf.class);
//                if (null != formConf) {
//                    formConf.setTitle(userTask.getName());
//                    formConf.setDisabled(true);
//                    formConf.setFormBtns(false);
//                    ProcessFormUtils.fillFormData(formConf, variables);
//                    procFormList.add(formConf);
//                }
//            }
//        }
//    }
//
//    /**
//     * 获取历史任务信息列表
//     */
//    private List<WfProcNodeVo> historyProcNodeList(HistoricProcessInstance historicProcIns) {
//        String procInsId = historicProcIns.getId();
//        List<HistoricActivityInstance> historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery()
//                .processInstanceId(procInsId)
//                .activityTypes(CollUtil.newHashSet(BpmnXMLConstants.ELEMENT_EVENT_START, BpmnXMLConstants.ELEMENT_EVENT_END, BpmnXMLConstants.ELEMENT_TASK_USER))
//                .orderByHistoricActivityInstanceStartTime().desc()
//                .orderByHistoricActivityInstanceEndTime().desc()
//                .list();
//
//        List<Comment> commentList = taskService.getProcessInstanceComments(procInsId);
//
//        List<WfProcNodeVo> elementVoList = new ArrayList<>();
//        for (HistoricActivityInstance activityInstance : historicActivityInstanceList) {
//            WfProcNodeVo elementVo = new WfProcNodeVo();
//            elementVo.setProcDefId(activityInstance.getProcessDefinitionId());
//            elementVo.setActivityId(activityInstance.getActivityId());
//            elementVo.setActivityName(activityInstance.getActivityName());
//            elementVo.setActivityType(activityInstance.getActivityType());
//            elementVo.setCreateTime(activityInstance.getStartTime());
//            elementVo.setEndTime(activityInstance.getEndTime());
//            if (ObjectUtil.isNotNull(activityInstance.getDurationInMillis())) {
//                elementVo.setDuration(DateUtil.formatBetween(activityInstance.getDurationInMillis(), BetweenFormatter.Level.SECOND));
//            }
//
//            if (BpmnXMLConstants.ELEMENT_EVENT_START.equals(activityInstance.getActivityType())) {
//                if (ObjectUtil.isNotNull(historicProcIns)) {
//                    Long userId = Long.parseLong(historicProcIns.getStartUserId());
//                    SysUser user = userService.selectUserById(userId);
//                    if (user != null) {
//                        elementVo.setAssigneeId(user.getUserId());
//                        elementVo.setAssigneeName(user.getNickName());
//                    }
//                }
//            } else if (BpmnXMLConstants.ELEMENT_TASK_USER.equals(activityInstance.getActivityType())) {
//                if (StringUtils.isNotBlank(activityInstance.getAssignee())) {
//                    SysUser user = userService.selectUserById(Long.parseLong(activityInstance.getAssignee()));
//                    elementVo.setAssigneeId(user.getUserId());
//                    elementVo.setAssigneeName(user.getNickName());
//                }
//                // 展示审批人员
//                List<HistoricIdentityLink> linksForTask = historyService.getHistoricIdentityLinksForTask(activityInstance.getTaskId());
//                StringBuilder stringBuilder = new StringBuilder();
//                for (HistoricIdentityLink identityLink : linksForTask) {
//                    if ("candidate".equals(identityLink.getType())) {
//                        if (StringUtils.isNotBlank(identityLink.getUserId())) {
//                            SysUser user = userService.selectUserById(Long.parseLong(identityLink.getUserId()));
//                            stringBuilder.append(user.getNickName()).append(",");
//                        }
//                        if (StringUtils.isNotBlank(identityLink.getGroupId())) {
//                            if (identityLink.getGroupId().startsWith(TaskConstants.ROLE_GROUP_PREFIX)) {
//                                Long roleId = Long.parseLong(StringUtils.stripStart(identityLink.getGroupId(), TaskConstants.ROLE_GROUP_PREFIX));
//                                SysRole role = roleService.selectRoleById(roleId);
//                                stringBuilder.append(role.getRoleName()).append(",");
//                            } else if (identityLink.getGroupId().startsWith(TaskConstants.DEPT_GROUP_PREFIX)) {
//                                Long deptId = Long.parseLong(StringUtils.stripStart(identityLink.getGroupId(), TaskConstants.DEPT_GROUP_PREFIX));
//                                SysDept dept = deptService.selectDeptById(deptId);
//                                stringBuilder.append(dept.getDeptName()).append(",");
//                            }
//                        }
//                    }
//                }
//                if (StringUtils.isNotBlank(stringBuilder)) {
//                    elementVo.setCandidate(stringBuilder.substring(0, stringBuilder.length() - 1));
//                }
//                // 获取意见评论内容
//                if (CollUtil.isNotEmpty(commentList)) {
//                    List<Comment> comments = new ArrayList<>();
//                    for (Comment comment : commentList) {
//
//                        if (comment.getTaskId().equals(activityInstance.getTaskId())) {
//                            comments.add(comment);
//                        }
//                    }
//                    elementVo.setCommentList(comments);
//                }
//            }
//            elementVoList.add(elementVo);
//        }
//        return elementVoList;
//    }
//
//    /**
//     * 获取流程执行过程
//     *
//     * @param procInsId
//     * @return
//     */
//    private WfViewerVo getFlowViewer(BpmnModel bpmnModel, String procInsId) {
//        // 构建查询条件
//        HistoricActivityInstanceQuery query = historyService.createHistoricActivityInstanceQuery()
//                .processInstanceId(procInsId);
//        List<HistoricActivityInstance> allActivityInstanceList = query.list();
//        if (CollUtil.isEmpty(allActivityInstanceList)) {
//            return new WfViewerVo();
//        }
//        // 查询所有已完成的元素
//        List<HistoricActivityInstance> finishedElementList = allActivityInstanceList.stream()
//                .filter(item -> ObjectUtil.isNotNull(item.getEndTime())).collect(Collectors.toList());
//        // 所有已完成的连线
//        Set<String> finishedSequenceFlowSet = new HashSet<>();
//        // 所有已完成的任务节点
//        Set<String> finishedTaskSet = new HashSet<>();
//        finishedElementList.forEach(item -> {
//            if (BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW.equals(item.getActivityType())) {
//                finishedSequenceFlowSet.add(item.getActivityId());
//            } else {
//                finishedTaskSet.add(item.getActivityId());
//            }
//        });
//        // 查询所有未结束的节点
//        Set<String> unfinishedTaskSet = allActivityInstanceList.stream()
//                .filter(item -> ObjectUtil.isNull(item.getEndTime()))
//                .map(HistoricActivityInstance::getActivityId)
//                .collect(Collectors.toSet());
//        // DFS 查询未通过的元素集合
//        Set<String> rejectedSet = FlowableUtils.dfsFindRejects(bpmnModel, unfinishedTaskSet, finishedSequenceFlowSet, finishedTaskSet);
//        return new WfViewerVo(finishedTaskSet, finishedSequenceFlowSet, unfinishedTaskSet, rejectedSet);
//    }
//}
